/*
 * ================================================================================
 *
 *       Filename:  rdma_tc.h
 *
 *    Description: RDMA flow control in software in node
 *
 *        Version:  1.0
 *        Created:  2024年07月15日 17时25分26秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Dr. Yuan Yulei (yyl), yyl_nudt@qq.com
 *        Company:  National University Defence Technology
 *
 * ================================================================================
 */


/**
 * @file	rdma_tc.h
 * @brief	
 */

#ifndef __RDMA_FC_H__
#define __RDMA_FC_H__

#include <stdbool.h>
#include <infiniband/verbs.h> 

#define QPN_NUM_MAX 10000
#define PRO_NUM_MAX 1000

struct flow_control
{
	unsigned long start_time;     /** 本控制周期的开始时间, us单位 */
	int periad;                   /** 控制的周期, us单位 */
	bool started;                 /** 控制周期是否开始 */
	bool goon;                    /** 是否运行下次发送 */
	int dat_len;
	int pkt_num;
	int exp_pkt_len;
	int exp_pkt_num;
};


extern struct flow_control fc_param1[QPN_NUM_MAX];
extern struct flow_control fc_param2[QPN_NUM_MAX];
extern struct flow_control fc_now1[QPN_NUM_MAX];
extern struct flow_control fc_now2[QPN_NUM_MAX];
extern bool config_read;

/**
 * 协议栈加载时, 读取配置文件, 并初始化流控参数
 */
int
rdma_tc_read_config(void);

/**
 * ibv_post_send操作之前
 * 根据当前控制策略，判断是否可以发送
 */
int
rdma_tc_ctl(struct ibv_qp *qp, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr);

/**
 * ibv_post_send操作完成后, 更新统计数据
 */
int 
rdma_tc_sta(struct ibv_qp *qp, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr);


#endif


